package br.com.jvet.entidade;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;

import br.com.jvet.constante.StatusInternacao;
import br.com.jvet.util.CommomUtils;

@Entity
@Table(name = "tbinternacao")
@SequenceGenerator(name = "seq_internacao", sequenceName = "seq_internacao", initialValue = 1, allocationSize = 1)
public class Internacao implements Serializable {

	private static final long serialVersionUID = 5121160322859041868L;
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq_internacao")
	private int codigo;
	@Column
	@Temporal(TemporalType.DATE)
	private Date entrada;
	@Column
	@Temporal(TemporalType.DATE)
	private Date saida;
	@Column
	@Temporal(TemporalType.TIME)
	private Date horarioVisita;
	@OneToOne
	private Animal animal;
	@Column
	private String descricao;
	@OneToOne
	private Funcionario funcionario;
	@OneToOne
	private Funcionario medicoResponsavel;
	@OneToOne
	private Usuario usuario;
	@Transient
	private int qtdDias;
	@OneToOne
	private Servico servico;
	@Transient
	private double valorTotal;
	@Column
	@Enumerated(EnumType.ORDINAL)
	private StatusInternacao status;
	@OneToOne(optional = true, cascade = CascadeType.ALL,orphanRemoval=true)
	@JoinColumn(name = "codpagamento", referencedColumnName = "codigo", nullable = true)
	private Pagamento pagamento;
	@Column
	private boolean possuiPagamento = false;

	public Internacao() {
		super();
		inicializar();
	}

	public void inicializar() {
		funcionario = new Funcionario();
		animal = new Animal();
		entrada = new Date();
		usuario = new Usuario();
		servico = new Servico();
		medicoResponsavel = new Funcionario();
		pagamento = new Pagamento();

	}

	public int getCodigo() {
		return codigo;
	}

	public void setCodigo(int codigo) {
		this.codigo = codigo;
	}

	public Date getEntrada() {
		return entrada;
	}

	public void setEntrada(Date entrada) {
		this.entrada = entrada;
	}

	public Date getSaida() {
		return saida;
	}

	public void setSaida(Date saida) {
		this.saida = saida;
	}

	public Date getHorarioVisita() {
		return horarioVisita;
	}

	public void setHorarioVisita(Date horarioVisita) {
		this.horarioVisita = horarioVisita;
	}

	public Animal getAnimal() {
		return animal;
	}

	public void setAnimal(Animal animal) {
		this.animal = animal;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public Funcionario getFuncionario() {
		return funcionario;
	}

	public void setFuncionario(Funcionario funcionario) {
		this.funcionario = funcionario;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public Funcionario getMedicoResponsavel() {
		return medicoResponsavel;
	}

	public void setMedicoResponsavel(Funcionario medicoResponsavel) {
		this.medicoResponsavel = medicoResponsavel;
	}

	public int getQtdDias() {
		if (getEntrada() != null && getSaida() != null) {
			qtdDias = CommomUtils.calculaDias(entrada, saida);
		}
		return qtdDias;
	}

	public void setQtdDias(int qtdDias) {
		this.qtdDias = qtdDias;
	}

	public Servico getServico() {
		return servico;
	}

	public void setServico(Servico servico) {
		this.servico = servico;
	}

	public double getValorTotal() {
		if (getServico() != null && getServico().getCodigo() > 0) {
			if (qtdDias == 0) {
				valorTotal = getServico().getValor();
			} else {
				valorTotal = getQtdDias() * getServico().getValor();
			}
		}
		return valorTotal;
	}

	public void setValorTotal(double valorTotal) {
		this.valorTotal = valorTotal;
	}

	public StatusInternacao getStatus() {
		return status;
	}

	public void setStatus(StatusInternacao status) {
		this.status = status;
	}

	public Pagamento getPagamento() {
		return pagamento;
	}

	public void setPagamento(Pagamento pagamento) {
		this.pagamento = pagamento;
	}

	public boolean isPossuiPagamento() {
		if (pagamento != null && pagamento.getCodigo() > 0) {
			possuiPagamento = true;
		}
		return possuiPagamento;
	}

	public void setPossuiPagamento(boolean possuiPagamento) {
		this.possuiPagamento = possuiPagamento;
	}

	@Override
	public String toString() {
		return "Internacao [codigo=" + codigo + ", entrada=" + entrada
				+ ", saida=" + saida + ", horarioVisita=" + horarioVisita
				+ ", animal=" + animal + ", descricao=" + descricao
				+ ", medicoVeterinario=" + funcionario + "]";
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + codigo;
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Internacao other = (Internacao) obj;
		if (codigo != other.codigo)
			return false;
		return true;
	}

	public Internacao clone() {
		Internacao inter = new Internacao();
		inter.setCodigo(codigo);
		inter.setAnimal(animal);
		inter.setDescricao(descricao);
		inter.setEntrada(entrada);
		inter.setFuncionario(funcionario);
		inter.setHorarioVisita(horarioVisita);
		inter.setMedicoResponsavel(medicoResponsavel);
		inter.setQtdDias(getQtdDias());
		inter.setSaida(saida);
		inter.setServico(servico);
		inter.setUsuario(usuario);
		inter.setValorTotal(valorTotal);
		inter.setPagamento(pagamento);
		inter.setPossuiPagamento(possuiPagamento);
		inter.setStatus(status);
		return inter;

	}
}
